/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package RRHH_controlador;

import CONTABILIDAD_MODELO.CON_DATOS_EMPRESA;
import CONTABILIDAD_MODELO.CON_MONEDA;
import Conexion.Conexion;
import RRHH_Modelo.RHH_BONO_ANTIGUEDAD;
import RRHH_Modelo.RHH_CREDITO_FISCAL;
import RRHH_Modelo.RHH_DEPARTAMENTO;
import RRHH_Modelo.RHH_EVENTOS_HITO;
import RRHH_Modelo.RHH_FECHAS_HITO;
import RRHH_Modelo.RHH_PERSONA;
import RRHH_Modelo.RHH_PLANILLA_EMPLEADOS;
import RRHH_Modelo.RHH_PLANILLA_EMPLEADOS_CABECE;
import RRHH_Modelo.RHH_PLANILLA_RETROACTIVOS;
import RRHH_Modelo.RHH_PLANILLA_RETROACTIVO_CABE;
import RRHH_Modelo.RHH_REGIONAL;
import RRHH_Modelo.RHH_SUCURSAL;
import RRHH_Modelo.RHH_USUARIO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author equipo_4
 */
@MultipartConfig
@WebServlet(name = "RRHH_PLANILLA_RETROACTIVOS_CONTROLLER", urlPatterns = {"/RRHH_PLANILLA_RETROACTIVOS_CONTROLLER"})
public class RRHH_PLANILLA_RETROACTIVOS_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet RRHH_PLANILLA_EMPLEADO_CONTROLLER</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet RRHH_PLANILLA_EMPLEADO_CONTROLLER at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            RHH_USUARIO usuario = ((RHH_USUARIO) request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getUSUARIO(), usuario.getPASSWORD());
            String evento = request.getParameter("evento");
            String html = "";
            switch (evento) {
                case "agregar":
                    html = agregar(request, con);
                    break;
                case "generar":
                    html = generar(request, con);
                    break;
                case "omitir":
                    html = omitir(request, con);
                    break;
                case "cargar":
                    html = cargar(request, con);
                    break;
                case "cargarEmpleados":
                    html = cargarEmpleados(request, con);
                    break;
                case "recalcular":
                    html = recalcular(request, con);
                    break;
            }
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
            con.Close();
        }
        catch (SQLException ex)
        {
            Logger.getLogger(RRHH_PLANILLA_RETROACTIVOS_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (ParseException ex)
        {
            Logger.getLogger(RRHH_PLANILLA_RETROACTIVOS_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() 
    {
        return "Short description";
    }// </editor-fold>

    private String agregar(HttpServletRequest request, Conexion con) throws SQLException, ParseException {
        String html = "";
        //PARAMETROS
        int ano = Integer.parseInt(request.getParameter("ano"));
        int mes = Integer.parseInt(request.getParameter("mes"));
        
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        Date fecha_hastad = formato.parse(request.getParameter("fecha_hasta"));
        con.Transacction();
        try {
            RHH_PLANILLA_RETROACTIVO_CABE cabe = new RHH_PLANILLA_RETROACTIVO_CABE(con).Buscar(ano,mes);
            
            int id_cabecera = 0;
            if(cabe!=null)
                id_cabecera=cabe.getID();
            else
            {
                cabe = new RHH_PLANILLA_RETROACTIVO_CABE(0, 1, ano, mes);
                cabe.setCon(con);
                id_cabecera = cabe.Insertar();
            }
            
            List<RHH_USUARIO> lista = new RHH_USUARIO(con).TodosNotInRetroactivo(mes, ano, formato.format(fecha_hastad));
            for (RHH_USUARIO usu : lista) 
            {
                double monto = Double.parseDouble(request.getParameter("monto"));
                double porcentaje = Double.parseDouble(request.getParameter("porcentaje"));
                
                Date fecha_desded = formato.parse(request.getParameter("fecha_desde"));
                Calendar fecha_desde = new GregorianCalendar();
                fecha_desde.setTime(fecha_desded);
                
                Calendar fecha_hasta = new GregorianCalendar();
                fecha_hastad = formato.parse(request.getParameter("fecha_hasta"));
                fecha_hasta.setTime(fecha_hastad);
                
                Calendar fechaactual = new GregorianCalendar();
                fechaactual.set(Calendar.YEAR, ano);
                fechaactual.set(Calendar.MONTH, mes - 1);
                String chb = request.getParameter("chb_" + usu.getID());
                if (chb != null) 
                {
                    String consulta = "SELECT RHH_USUARIO.ID,RHH_PERSONA.CI,\n"
                            + "       RHH_PERSONA.LUGAR_EMISION,\n"
                            + "       RHH_PERSONA.PRIMER_NOMBRE,\n"
                            + "       RHH_PERSONA.SEGUNDO_NOMBRE,\n"
                            + "       RHH_PERSONA.PRIMER_APELLIDO,\n"
                            + "       RHH_PERSONA.SEGUNDO_APELLIDO,\n"
                            + "       RHH_PERSONA.TELEFONO,\n"
                            + "       RHH_PERSONA.EMAIL,\n"
                            + "       RHH_FECHAS_HITO.FECHA,\n"
                            + "       RHH_CARGO.DESCRIPCION AS CARGO,\n"
                            + "       RHH_DEPARTAMENTO.ID AS DEPARTAMENTO,\n"
                            + "       RHH_REGIONAL.ID AS REGIONAL,\n"
                            + "       RHH_SUCURSAL.ID AS SUCURSAL,\n"
                            + "       RHH_FECHAS_HITO.SALARIO,\n"
                            + "       RHH_USUARIO.ESTADO\n"
                            + "  FROM BROKER.RHH_CARGO,\n"
                            + "       BROKER.RHH_USUARIO,\n"
                            + "       BROKER.RHH_PERSONA,\n"
                            + "       BROKER.RHH_FECHAS_HITO,\n"
                            + "       BROKER.RHH_CARGO_DEP_REG_SUC,\n"
                            + "       BROKER.RHH_DEPARTAMENTO,\n"
                            + "       BROKER.RHH_REGIONAL,\n"
                            + "       BROKER.RHH_SUCURSAL\n"
                            + " WHERE     (RHH_USUARIO.ID_CARGO = RHH_CARGO.ID)\n"
                            + "       AND (RHH_USUARIO.ID_PERSONA = RHH_PERSONA.ID)\n"
                            + "       AND (RHH_FECHAS_HITO.ID_USUARIO = RHH_USUARIO.ID)\n"
                            + "       AND (RHH_CARGO_DEP_REG_SUC.ID_CARGO = RHH_CARGO.ID)\n"
                            + "       AND (RHH_CARGO_DEP_REG_SUC.ID_DEPTO = RHH_DEPARTAMENTO.ID(+))\n"
                            + "       AND (RHH_CARGO_DEP_REG_SUC.ID_REGIONAL = RHH_REGIONAL.ID(+))\n"
                            + "       AND (RHH_CARGO_DEP_REG_SUC.ID_SUCURSAL = RHH_SUCURSAL.ID(+))\n"
                            + "       AND (RHH_FECHAS_HITO.ID_EVENTO_HITO = 3)\n"
                            + "       AND (RHH_USUARIO.ID = " + usu.getID() + ")\n"
                            + "       ORDER BY RHH_PERSONA.PRIMER_APELLIDO";

                    ResultSet rs = con.EjecutarConsulta(consulta);

                    if (rs.next()) {
                        RHH_PLANILLA_RETROACTIVOS planilla = new RHH_PLANILLA_RETROACTIVOS(con);
                        int id_usuairo = rs.getInt("ID");
                        int usuario_estado = rs.getInt("ESTADO");
                        planilla.setID_USUARIO(id_usuairo);
                        planilla.setID_CABECERA(id_cabecera);                        
                        int ci = rs.getInt("CI");

                        Date ingreso = rs.getDate("FECHA");
                        Calendar fecha_ingreso = new GregorianCalendar();
                        fecha_ingreso.setTime(ingreso);
                        planilla.setFECHA_INGRESO_EMPRESA(ingreso);


                        RHH_FECHAS_HITO fechai = new RHH_FECHAS_HITO(con).retiro(id_usuairo);
                        Date retiro_fecha = null;
                        String retiro_motivo = "";
                        String retiro_observacion = "";

                        if (fechai != null) {
                            retiro_fecha = fechai.getFECHAinDate();
                            retiro_motivo = new RHH_EVENTOS_HITO(con).getEvento(fechai.getID_EVENTO_HITO());
                            retiro_observacion = fechai.getDESCRIPCION();
                        }
                        planilla.setFECHA_INICIO(fecha_desded);
                        planilla.setFECHA_FIN(fecha_hastad);
                        
                        planilla.setFECHA_RETIRO_EMPRESA(retiro_fecha);
                        planilla.setMOTIVO_RETIRO(retiro_motivo);
                        planilla.setOBSERVACION_RETIRO(retiro_observacion);

                        Calendar calendario = new GregorianCalendar();
                        calendario.set(Calendar.YEAR, 0);
                        calendario.set(Calendar.MONTH, 0);
                        calendario.set(Calendar.DAY_OF_MONTH, 1);

                        int anof = 0;
                        int mesf = 0;
                        int diaf = 0;
                        if (ingreso != null) {
                            Date fecha1 = ingreso;
                            Date fecha2 = new GregorianCalendar().getTime();
                            long diferencia = fecha2.getTime() - fecha1.getTime();
                            int dia = (int) (diferencia / (3600000 * 24));
                            calendario.add(Calendar.DAY_OF_MONTH, dia);
                            if (dia < 365) {
                                anof = 0;
                            } else {
                                anof = calendario.get(Calendar.YEAR);
                            }

                            mesf = calendario.get(Calendar.MONTH);
                            diaf = calendario.get(Calendar.DAY_OF_MONTH);
                        }

                        planilla.setANTIGUEDAD_DIA(diaf);
                        planilla.setANTIGUEDAD_MES(mesf);
                        planilla.setANTIGUEDAD_ANO(anof);

                        String cargo = rs.getString("CARGO");
                        cargo = cargo == null ? "" : cargo;

                        planilla.setCARGO(cargo);

                        int departamento = rs.getInt("DEPARTAMENTO");                        
                        planilla.setDEPARTAMENTO(departamento);

                        int regional = rs.getInt("REGIONAL");                        
                        planilla.setREGIONAL(regional);

                        int sucursal = rs.getInt("SUCURSAL");                        
                        planilla.setSUCURSAL(sucursal);


                        int dias_de_retroactivo = Calculo_entre_fechas(fecha_desde.getTime(), fecha_hasta.getTime());
                        planilla.setDIAS_DE_RETROACTIVO(dias_de_retroactivo);
                        int dias_trabajados_retroactivos = 0;

                        RHH_FECHAS_HITO retiro = new RHH_FECHAS_HITO(con).retiro(usu.getID());
                        Calendar fecha_retiro = null;
                        if (retiro != null) {
                            fecha_retiro = new GregorianCalendar();
                            fecha_retiro.setTime(retiro.getFECHAinDate());
                        }

                        if (fecha_retiro != null) {
                            //CUENDO EL RETROACTIVO ESTA INMERSO EN EL CONTRATO DEL EMPLEADO
                            if (fecha_desde.after(fecha_ingreso) && fecha_hasta.before(fecha_retiro)) {
                                dias_trabajados_retroactivos = dias_de_retroactivo;
                            }
                            //CUENDO EL RETROACTIVO ES ANTES DEL INICIO DE SU CONTRATO PERO EL EMPELADO SIGUE TRABAJANDO
                            if (fecha_desde.before(fecha_ingreso) && fecha_hasta.before(fecha_retiro)) {
                                dias_trabajados_retroactivos = Calculo_entre_fechas(fecha_ingreso.getTime(), fecha_hasta.getTime());
                            }
                            //CUENDO EL RETROACTIVO ES SUPERIOR A SU CONTRATO
                            if (fecha_desde.before(ingreso) && fecha_hasta.after(fecha_retiro)) {
                                dias_trabajados_retroactivos = Calculo_entre_fechas(fecha_ingreso.getTime(), fecha_retiro.getTime());
                            }
                            //CUENDO EL EMPLEADO A INICIADO ANTES DEL RETROACTIVO Y A TERMINADO SU CONTRATO ANTES QUE TERMINE EL RETROACTIVO
                            if (fecha_desde.after(ingreso) && fecha_hasta.after(fecha_retiro)) {
                                dias_trabajados_retroactivos = Calculo_entre_fechas(fecha_desde.getTime(), fecha_retiro.getTime());
                            }
                        } else {
                            if (fecha_desde.after(fecha_ingreso)) {
                                dias_trabajados_retroactivos = dias_de_retroactivo;
                            }
                            //CUENDO EL RETROACTIVO ES ANTES DEL INICIO DE SU CONTRATO PERO EL EMPELADO SIGUE TRABAJANDO
                            if (fecha_desde.before(fecha_ingreso)) {
                                dias_trabajados_retroactivos = Calculo_entre_fechas(fecha_ingreso.getTime(), fecha_hasta.getTime());
                            }
                        }
                        
                        planilla.setDIAS_TRABAJADOS(dias_trabajados_retroactivos);
                        
                        double monto_retroactivo = 0;
                        double incrementeo_retroactivo_mes_actual = 0;
                        if (monto != 0) {
                            monto_retroactivo = ((monto / dias_de_retroactivo) * dias_trabajados_retroactivos);
                            if (monto_retroactivo < monto) {
                                incrementeo_retroactivo_mes_actual = monto_retroactivo;
                            }
                        } else {
                            double salario = new RHH_FECHAS_HITO(con).salarioUsuario(id_usuairo);
                            double porc = porcentaje / 100;
                            monto = salario * porc;
                            monto_retroactivo = ((monto / dias_de_retroactivo) * dias_trabajados_retroactivos);
                            if (monto_retroactivo < monto) {
                                incrementeo_retroactivo_mes_actual = monto_retroactivo;
                            }
                        }
                        
                        planilla.setINCREMENTO_RETROACTIVO_MES_ACT(incrementeo_retroactivo_mes_actual);
                        boolean mes_cerrado = false;
                        RHH_PLANILLA_EMPLEADOS_CABECE ca = new RHH_PLANILLA_EMPLEADOS_CABECE(con).Buscar(ano, mes);
                        if (ca!=null) {
                            if (ca.getESTADO() == 0) {
                                mes_cerrado = true;
                            }
                        }


                        RHH_FECHAS_HITO fi = new RHH_FECHAS_HITO(0, "INCREMENTO RETROACTIVO", new GregorianCalendar().getTime(), monto, usu.getID(), cargo, 8);
                        fi.setCon(con);
                        fi.Insertar();

                        if (mes_cerrado) {
                            if (incrementeo_retroactivo_mes_actual == 0) {
                                incrementeo_retroactivo_mes_actual = monto;
                            }
                        }
                        double total_monto_retroactivo = 0;

                        CON_DATOS_EMPRESA datos_empresa = new CON_DATOS_EMPRESA(con).Buscar();
                        double salariominimo_nal_retro = datos_empresa.getSALARIO_MINIMO_NAL_RETROACTIVO();
                        double bono_antiguedad_retroactivo = 0;

                        while (fecha_desde.before(fecha_hasta)) {
                            total_monto_retroactivo += monto_retroactivo;
                            calendario = new GregorianCalendar();
                            calendario.set(Calendar.YEAR, 0);
                            calendario.set(Calendar.MONTH, 0);
                            calendario.set(Calendar.DAY_OF_MONTH, 1);

                            int eanof = 0;
                            int emesf = 0;
                            int ediaf = 0;

                            if (ingreso != null) {
                                Date fecha1 = ingreso;
                                Date fecha2 = fecha_desde.getTime();
                                long diferencia = fecha2.getTime() - fecha1.getTime();
                                int dia = (int) (diferencia / (3600000 * 24));
                                calendario.add(Calendar.DAY_OF_MONTH, dia);
                                if (dia < 365) {
                                    eanof = 0;
                                } else {
                                    eanof = calendario.get(Calendar.YEAR);
                                }

                                RHH_BONO_ANTIGUEDAD banti = new RHH_BONO_ANTIGUEDAD(con).sacarPorcentaje(eanof);
                                double porcentaje_antiguedad = banti.getPORCENTAJE() / 100;



                                int multiplic = datos_empresa.getBONO_ANTIGUEDAD_RETROACTIVO();

                                bono_antiguedad_retroactivo += porcentaje_antiguedad * (multiplic * salariominimo_nal_retro);
                            }
                            fecha_desde.add(Calendar.MONTH, 1);
                        }

                        planilla.setTOTAL_MONTO_RETROACTIVO(total_monto_retroactivo);
                        planilla.setBONO_ANTIGUEDAD(bono_antiguedad_retroactivo);


                        double total_ganado = total_monto_retroactivo + bono_antiguedad_retroactivo;
                        planilla.setTOTAL_GANADO(total_ganado);


                        double porc_largo_plazo = 0.0;
                        if (usuario_estado == 3) {
                            porc_largo_plazo = datos_empresa.getPORCENTAJE_JUBILADOS();
                        } else {
                            porc_largo_plazo = datos_empresa.getPORCENTAJE_LARGO_PLAZO();
                        }

                        double seguro_largo_plazo = total_ganado * (porc_largo_plazo / 100);
                        planilla.setSEGURO_LARGO_PLAZO(seguro_largo_plazo);

                        double porc_riesgo_comun = datos_empresa.getPORCENTAJE_RIESGO_COMUN();
                        double riesgo_comun = total_ganado * (porc_riesgo_comun / 100);
                        planilla.setRIESGO_COMUN(riesgo_comun);

                        double porc_afp = datos_empresa.getPORCENTAJE_COMISION_AFP();
                        double afp = total_ganado * (porc_afp / 100);
                        planilla.setCOMISION_AFP(afp);

                        double porc_solidario_asegurado = datos_empresa.getPORCENTAJE_SOLIDARIO();
                        double solidario_asegurado = total_ganado * (porc_solidario_asegurado / 100);
                        planilla.setSOLIDARIO_ASEGURADO(solidario_asegurado);

                        double monto_SNA = datos_empresa.getMONTO_SOLIDARIO_NAC_A();
                        double monto_SNB = datos_empresa.getMONTO_SOLIDARIO_NAC_B();
                        double monto_SNC = datos_empresa.getMONTO_SOLIDARIO_NAC_C();
                        double porc_SNA = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_A();
                        double porc_SNB = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_B();
                        double porc_SNC = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_C();

                        double solidarion_nacional = 0.0;

                        if (total_ganado >= monto_SNA && total_ganado < monto_SNB) {
                            solidarion_nacional = (total_ganado - monto_SNA) * (porc_SNA / 100);
                        }
                        if (total_ganado >= monto_SNB && total_ganado < monto_SNC) {
                            solidarion_nacional = (total_ganado - monto_SNA) * (porc_SNA / 100);
                            solidarion_nacional += (total_ganado - monto_SNB) * (porc_SNB / 100);
                        }
                        if (total_ganado >= monto_SNC) {
                            solidarion_nacional = (total_ganado - monto_SNA) * (porc_SNA / 100);
                            solidarion_nacional += (total_ganado - monto_SNB) * (porc_SNB / 100);
                            solidarion_nacional += (total_ganado - monto_SNC) * (porc_SNC / 100);
                        }

                        planilla.setSOLIDARIO_NACIONAL(solidarion_nacional);

                        Double total_aporte_laboral = seguro_largo_plazo + riesgo_comun + afp + solidario_asegurado + solidarion_nacional;
                        planilla.setTOTAL_APORTE_LABORAL(total_aporte_laboral);

                        double porc_csbp = datos_empresa.getPORCENTAJE_CSBP_SEG_MED();
                        double csbp = total_ganado * (porc_csbp / 100);
                        planilla.setCSBP(csbp);

                        double porc_afp_pro = datos_empresa.getPORCENTAJE_RISEGO_PROFESIONAL();
                        double afp_pro = total_ganado * (porc_afp_pro / 100);
                        planilla.setRIESGO_PROFESIONAL(afp_pro);

                        double porc_aporte_pro = datos_empresa.getPORCENTAJE_APORTE_PRO();
                        double aporte_pro = total_ganado * (porc_aporte_pro / 100);
                        planilla.setPRO_VIVIENDA(aporte_pro);

                        double porc_aporte_solidario = datos_empresa.getPORCENTAJE_SOLIDARIO();
                        double aporte_solidario = total_ganado * (porc_aporte_solidario / 100);
                        planilla.setAPORTE_SOLIDARIO(aporte_solidario);

                        double total_aporte_patronal = csbp + afp_pro + aporte_pro + aporte_solidario;
                        planilla.setTOTAL_APORTE_PATRONAL(total_aporte_patronal);

                        double salario_neto_sujeto_imp = total_ganado - total_aporte_laboral;
                        planilla.setRETROACTIVO_NETO_SUJ_IMPUESTOS(salario_neto_sujeto_imp);



                        double minimo_moinmp = salariominimo_nal_retro * 2;

                        if (minimo_moinmp >= salario_neto_sujeto_imp) {
                            minimo_moinmp = salario_neto_sujeto_imp;
                        }
                        planilla.setMINIMO_NO_IMPONIBLE(minimo_moinmp);

                        double dif_sujeta_impuestos = salario_neto_sujeto_imp - minimo_moinmp;
                        planilla.setDIFERENCIA_SUJ_IMPUESTOS(dif_sujeta_impuestos);

                        double imp_liquidado = dif_sujeta_impuestos * 0.13;
                        planilla.setIMPUESTO_LIQUIDADO(imp_liquidado);

                        double computo_iva = 0;

                        double computo_iva_ddj = computo_iva;
                        planilla.setCOMPUTO_IVA_DDJJ(computo_iva_ddj);

                        double sobre_dos_salarios_minimos = 0.0;
                        if (dif_sujeta_impuestos != 0) {
                            if (imp_liquidado < (0.13 * (salariominimo_nal_retro * 2))) {
                                sobre_dos_salarios_minimos = imp_liquidado;
                            } else {
                                sobre_dos_salarios_minimos = (0.13 * (salariominimo_nal_retro * 2));
                            }
                        }
                        planilla.setSOBRE_2_SALARIOS_MIN(sobre_dos_salarios_minimos);


                        double saldo_favor = 0.0;
                        if ((imp_liquidado - computo_iva_ddj - sobre_dos_salarios_minimos) < 0) {
                            saldo_favor = 0.0;
                        } else {
                            saldo_favor = (imp_liquidado - computo_iva_ddj - sobre_dos_salarios_minimos);
                        }
                        planilla.setSALDO_FAVOR(saldo_favor);

                        double saldo_favor_empleado = 0.0;
                        if (sobre_dos_salarios_minimos > imp_liquidado) {
                            saldo_favor_empleado = 0.0;
                        } else {
                            if (sobre_dos_salarios_minimos + computo_iva_ddj - imp_liquidado < 0) {
                                saldo_favor_empleado = 0.0;
                            } else {
                                saldo_favor_empleado = sobre_dos_salarios_minimos + computo_iva_ddj - imp_liquidado;
                            }
                        }
                        planilla.setSALDO_FAVOR_EMPLEADO(saldo_favor_empleado);

                        Calendar fecha_anterior = new GregorianCalendar();
                        fecha_anterior.add(Calendar.MONTH, -1);
                        int ano_anterior = fecha_anterior.get(Calendar.YEAR);
                        int mes_anterior = fecha_anterior.get(Calendar.MONTH) + 1;
                        RHH_PLANILLA_EMPLEADOS planilla_anterior = new RHH_PLANILLA_EMPLEADOS(con).BuscarxUSUARIO(ano_anterior, mes_anterior, id_usuairo);
                        double saldo_mes_anterior = 0;
                        if (planilla_anterior != null) {
                            saldo_mes_anterior = planilla_anterior.getSALDO_FAVOR_SIGUIENTE_MES();
                        }

                        planilla.setSALDO_MES_ANTERIOR(saldo_mes_anterior);

                        CON_MONEDA moneda = new CON_MONEDA();
                        moneda.setCon(con);

                        double moneda_inflacionaria_mes_anterior = moneda.Buscar_Inflacionaria_Mes_Pasado(mes_anterior, ano_anterior);
                        planilla.setUFV_MES_PASADO(moneda_inflacionaria_mes_anterior);

                        double moneda_inflacionaria_actual = moneda.Buscar_Inflacionaria_actual();
                        planilla.setUFV_MES_ACTUAL(moneda_inflacionaria_actual);

                        double actualizacion = ((saldo_mes_anterior / moneda_inflacionaria_mes_anterior) * moneda_inflacionaria_actual) - saldo_mes_anterior;
                        planilla.setACTUALIZACION(actualizacion);

                        double sub_total = saldo_mes_anterior + actualizacion;
                        planilla.setSUB_TOTAL(sub_total);

                        double saldo_total_a_favor_empleado = saldo_favor_empleado + sub_total;
                        planilla.setSALDO_TOTAL_FAVOR_EMPLEADO(saldo_total_a_favor_empleado);

                        double saldo_utilizado = 0.0;
                        if (saldo_total_a_favor_empleado > saldo_favor) {
                            saldo_utilizado = saldo_favor;
                        } else {
                            saldo_utilizado = saldo_total_a_favor_empleado;
                        }
                        planilla.setSALDO_UTILIZADO(saldo_utilizado);

                        double impuesto_retenido_pagar = 0.0;
                        if (saldo_total_a_favor_empleado < saldo_favor) {
                            impuesto_retenido_pagar = saldo_favor - saldo_total_a_favor_empleado;
                        }
                        planilla.setIMPUESTO_RETENIDO_PAGAR(impuesto_retenido_pagar);

                        double saldo_favor_sigte_mes = 0.0;
                        if (saldo_total_a_favor_empleado > saldo_favor) {
                            saldo_favor_sigte_mes = saldo_total_a_favor_empleado - saldo_utilizado;
                        }
                        planilla.setSALDO_FAVOR_SIGUIENTE_MES(saldo_favor_sigte_mes);

                        double total_liquido_pagable = total_ganado - total_aporte_laboral - impuesto_retenido_pagar;
                        planilla.setTOTAL_RETROACTIVO_PAGABLE(total_liquido_pagable);

                        int id_planilla = planilla.Insertar();

                        String LUGAR_EMISION = rs.getString("LUGAR_EMISION");
                        LUGAR_EMISION = LUGAR_EMISION == null ? "" : LUGAR_EMISION;
                        String PRIMER_NOMBRE = rs.getString("PRIMER_NOMBRE");
                        PRIMER_NOMBRE = PRIMER_NOMBRE == null ? "" : PRIMER_NOMBRE;
                        String SEGUNDO_NOMBRE = rs.getString("SEGUNDO_NOMBRE");
                        SEGUNDO_NOMBRE = SEGUNDO_NOMBRE == null ? "" : SEGUNDO_NOMBRE;
                        String PRIMER_APELLIDO = rs.getString("PRIMER_APELLIDO");
                        PRIMER_APELLIDO = PRIMER_APELLIDO == null ? "" : PRIMER_APELLIDO;
                        String SEGUNDO_APELLIDO = rs.getString("SEGUNDO_APELLIDO");
                        SEGUNDO_APELLIDO = SEGUNDO_APELLIDO == null ? "" : SEGUNDO_APELLIDO;
                        String TELEFONO = rs.getString("TELEFONO");
                        TELEFONO = TELEFONO == null ? "" : TELEFONO;
                        String EMAIL = rs.getString("EMAIL");
                        EMAIL = EMAIL == null ? "" : EMAIL;

                        html += "<tr>";
                        html += "<td>" + ci + "</td>";
                        html += "<td>" + LUGAR_EMISION + "</td>";
                        html += "<td>" + PRIMER_NOMBRE + "</td>";
                        html += "<td>" + SEGUNDO_NOMBRE + "</td>";
                        html += "<td>" + PRIMER_APELLIDO + "</td>";
                        html += "<td>" + SEGUNDO_APELLIDO + "</td>";
                        html += "<td>" + TELEFONO + "</td>";
                        html += "<td>" + EMAIL + "</td>";
                        if (ingreso != null) {
                            html += "<td>" + formato.format(ingreso) + "</td>";
                        } else {
                            html += "<td></td>";
                        }

                        if (retiro_fecha != null) {
                            html += "<td>" + formato.format(retiro_fecha) + "</td>";
                        } else {
                            html += "<td></td>";
                        }
                        html += "<td>" + retiro_motivo + "</td>";
                        html += "<td>" + retiro_observacion + "</td>";
                        html += "<td>" + diaf + "</td>";
                        html += "<td>" + mesf + "</td>";
                        html += "<td>" + anof + "</td>";
                        html += "<td>" + cargo + "</td>";
                        String depto="***";
                        if(departamento!=0)
                            depto=new RHH_DEPARTAMENTO(con).BuscarXid(departamento).getDESCRIPCION();
                        html += "<td>" + depto + "</td>";
                        String reg="***";
                        if(regional!=0)
                            reg=new RHH_REGIONAL(con).BuscarXid(regional).getDESCRIPCION();
                        html += "<td>" + regional + "</td>";
                        String suc="***";
                        if(sucursal!=0)
                            suc=new RHH_SUCURSAL(con).BuscarXid(sucursal).getDESCRIPCION();
                        html += "<td>" + sucursal + "</td>";
                        html += "<td>" + incrementeo_retroactivo_mes_actual + "</td>";
                        html += "<td>" + dias_de_retroactivo + "</td>";
                        html += "<td>" + dias_trabajados_retroactivos + "</td>";
                        html += "<td>" + total_monto_retroactivo + "</td>";
                        html += "<td>" + bono_antiguedad_retroactivo + "</td>";
                        html += "<td>" + total_ganado + "</td>";
                        html += "<td>" + seguro_largo_plazo + "</td>";
                        html += "<td>" + riesgo_comun + "</td>";
                        html += "<td>" + afp + "</td>";
                        html += "<td>" + solidario_asegurado + "</td>";
                        html += "<td>" + solidarion_nacional + "</td>";
                        html += "<td>" + total_aporte_laboral + "</td>";
                        html += "<td>" + csbp + "</td>";
                        html += "<td>" + afp_pro + "</td>";
                        html += "<td>" + aporte_pro + "</td>";
                        html += "<td>" + aporte_solidario + "</td>";
                        html += "<td>" + total_aporte_patronal + "</td>";
                        html += "<td>" + salario_neto_sujeto_imp + "</td>";
                        html += "<td>" + minimo_moinmp + "</td>";
                        html += "<td>" + dif_sujeta_impuestos + "</td>";
                        html += "<td>" + imp_liquidado + "</td>";
                        html += "<td><input type='number' onblur='recalcular(this," + id_planilla + ");' value='" + computo_iva_ddj + "' min='0'/> </td>";
                        html += "<td>" + sobre_dos_salarios_minimos + "</td>";
                        html += "<td>" + saldo_favor + "</td>";
                        html += "<td>" + saldo_favor_empleado + "</td>";
                        html += "<td><input type='number' onblur='recalcular(this," + id_planilla + ");' value='" + saldo_mes_anterior + "' min='0'/> </td>";
                        html += "<td><input type='number' onblur='recalcular(this," + id_planilla + ");' value='" + moneda_inflacionaria_mes_anterior + "' min='0'/> </td>";
                        html += "<td>" + moneda_inflacionaria_actual + "</td>";
                        html += "<td>" + actualizacion + "</td>";
                        html += "<td>" + sub_total + "</td>";
                        html += "<td>" + saldo_total_a_favor_empleado + "</td>";
                        html += "<td>" + saldo_utilizado + "</td>";
                        html += "<td>" + impuesto_retenido_pagar + "</td>";
                        html += "<td>" + saldo_favor_sigte_mes + "</td>";
                        html += "<td>" + total_liquido_pagable + "</td>";
                        html += "<td><a href='#' onclick='omitir(" + id_planilla + ",this)'>(X)</a></td>";
                        html += "</tr>";
                    }
                }
            }
            con.commit();
        } catch (SQLException ex) {
            con.rollback();
            ex.printStackTrace();
            html = "";
        }
        return html;
    }

    private String recalcular(HttpServletRequest request, Conexion con) throws SQLException, ParseException {
        String html = "";
                
        int id_planilla = Integer.parseInt(request.getParameter("id"));

        con.Transacction();
        try {

            RHH_PLANILLA_RETROACTIVOS planilla = new RHH_PLANILLA_RETROACTIVOS(con).Buscar(id_planilla);            

            int id_usuairo = planilla.getID_USUARIO();      
            double computo_iva = Double.parseDouble(request.getParameter("computo_iva"));
            double computo_iva_ddj = computo_iva;
            planilla.setCOMPUTO_IVA_DDJJ(computo_iva_ddj);
                        
            double imp_liquidado = planilla.getIMPUESTO_LIQUIDADO();            
            double sobre_dos_salarios_minimos = planilla.getSOBRE_2_SALARIOS_MIN();            

            double saldo_favor = 0.0;
            if ((imp_liquidado - computo_iva_ddj - sobre_dos_salarios_minimos) < 0) {
                saldo_favor = 0.0;
            } else {
                saldo_favor = (imp_liquidado - computo_iva_ddj - sobre_dos_salarios_minimos);
            }
            planilla.setSALDO_FAVOR(saldo_favor);

            double saldo_favor_empleado = 0.0;
            if (sobre_dos_salarios_minimos > imp_liquidado) {
                saldo_favor_empleado = 0.0;
            } else {
                if (sobre_dos_salarios_minimos + computo_iva_ddj - imp_liquidado < 0) {
                    saldo_favor_empleado = 0.0;
                } else {
                    saldo_favor_empleado = sobre_dos_salarios_minimos + computo_iva_ddj - imp_liquidado;
                }
            }
            planilla.setSALDO_FAVOR_EMPLEADO(saldo_favor_empleado);           
            
            double saldo_mes_anterior = Double.parseDouble(request.getParameter("saldo_mes_anterior"));
            planilla.setSALDO_MES_ANTERIOR(saldo_mes_anterior);

            CON_MONEDA moneda = new CON_MONEDA();
            moneda.setCon(con);

            double moneda_inflacionaria_mes_anterior = Double.parseDouble(request.getParameter("ufv_pasado"));
            planilla.setUFV_MES_PASADO(moneda_inflacionaria_mes_anterior);

            double moneda_inflacionaria_actual = moneda.Buscar_Inflacionaria_actual();
            planilla.setUFV_MES_ACTUAL(moneda_inflacionaria_actual);

            double actualizacion = ((saldo_mes_anterior / moneda_inflacionaria_mes_anterior) * moneda_inflacionaria_actual) - saldo_mes_anterior;
            planilla.setACTUALIZACION(actualizacion);

            double sub_total = saldo_mes_anterior + actualizacion;
            planilla.setSUB_TOTAL(sub_total);

            double saldo_total_a_favor_empleado = saldo_favor_empleado + sub_total;
            planilla.setSALDO_TOTAL_FAVOR_EMPLEADO(saldo_total_a_favor_empleado);

            double saldo_utilizado = 0.0;
            if (saldo_total_a_favor_empleado > saldo_favor) {
                saldo_utilizado = saldo_favor;
            } else {
                saldo_utilizado = saldo_total_a_favor_empleado;
            }
            planilla.setSALDO_UTILIZADO(saldo_utilizado);

            double impuesto_retenido_pagar = 0.0;
            if (saldo_total_a_favor_empleado < saldo_favor) {
                impuesto_retenido_pagar = saldo_favor - saldo_total_a_favor_empleado;
            }
            planilla.setIMPUESTO_RETENIDO_PAGAR(impuesto_retenido_pagar);

            double saldo_favor_sigte_mes = 0.0;
            if (saldo_total_a_favor_empleado > saldo_favor) {
                saldo_favor_sigte_mes = saldo_total_a_favor_empleado - saldo_utilizado;
            }
            planilla.setSALDO_FAVOR_SIGUIENTE_MES(saldo_favor_sigte_mes);

            double total_liquido_pagable = planilla.getTOTAL_GANADO() - planilla.getTOTAL_APORTE_LABORAL() - impuesto_retenido_pagar;
            planilla.setTOTAL_RETROACTIVO_PAGABLE(total_liquido_pagable);

            planilla.Modificar();

            RHH_PERSONA p = new RHH_PERSONA(con).BuscarxID_Usuario(id_usuairo);
            String LUGAR_EMISION = p.getLUGAR_EMISION();
            LUGAR_EMISION = LUGAR_EMISION == null ? "" : LUGAR_EMISION;
            String PRIMER_NOMBRE = p.getPRIMER_NOMBRE();
            PRIMER_NOMBRE = PRIMER_NOMBRE == null ? "" : PRIMER_NOMBRE;
            String SEGUNDO_NOMBRE = p.getSEGUNDO_NOMBRE();
            SEGUNDO_NOMBRE = SEGUNDO_NOMBRE == null ? "" : SEGUNDO_NOMBRE;
            String PRIMER_APELLIDO = p.getPRIMER_APELLIDO();
            PRIMER_APELLIDO = PRIMER_APELLIDO == null ? "" : PRIMER_APELLIDO;
            String SEGUNDO_APELLIDO = p.getSEGUNDO_APELLIDO();
            SEGUNDO_APELLIDO = SEGUNDO_APELLIDO == null ? "" : SEGUNDO_APELLIDO;
            String TELEFONO = p.getTELEFONO();
            TELEFONO = TELEFONO == null ? "" : TELEFONO;
            String EMAIL = p.getEMAIL();
            EMAIL = EMAIL == null ? "" : EMAIL;           
                        
            html += "<td>" + p.getCI() + "</td>";
            html += "<td>" + LUGAR_EMISION + "</td>";
            html += "<td>" + PRIMER_NOMBRE + "</td>";
            html += "<td>" + SEGUNDO_NOMBRE + "</td>";
            html += "<td>" + PRIMER_APELLIDO + "</td>";
            html += "<td>" + SEGUNDO_APELLIDO + "</td>";
            html += "<td>" + TELEFONO + "</td>";
            html += "<td>" + EMAIL + "</td>";
            if (planilla.getFECHA_INGRESO_EMPRESA() != null) {
                html += "<td>" + planilla.getFECHA_INGRESO_EMPRESA() + "</td>";
            } else {
                html += "<td></td>";
            }
            
            html += "<td>" + planilla.getFECHA_RETIRO_EMPRESA()+ "</td>";
            html += "<td>" + planilla.getMOTIVO_RETIRO() + "</td>";
            html += "<td>" + planilla.getOBSERVACION_RETIRO() + "</td>";
            html += "<td>" + planilla.getANTIGUEDAD_DIA() + "</td>";
            html += "<td>" + planilla.getANTIGUEDAD_MES() + "</td>";
            html += "<td>" + planilla.getANTIGUEDAD_ANO() + "</td>";
            html += "<td>" + planilla.getCARGO() + "</td>";
            html += "<td>" + planilla.getDEPARTAMENTO() + "</td>";
            html += "<td>" + planilla.getREGIONAL() + "</td>";
            html += "<td>" + planilla.getSUCURSAL() + "</td>";
            html += "<td>" + planilla.getINCREMENTO_RETROACTIVO_MES_ACT() + "</td>";
            html += "<td>" + planilla.getDIAS_DE_RETROACTIVO() + "</td>";
            html += "<td>" + planilla.getDIAS_TRABAJADOS() + "</td>";
            html += "<td>" + planilla.getTOTAL_MONTO_RETROACTIVO() + "</td>";
            html += "<td>" + planilla.getBONO_ANTIGUEDAD() + "</td>";
            html += "<td>" + planilla.getTOTAL_GANADO() + "</td>";
            html += "<td>" + planilla.getSEGURO_LARGO_PLAZO() + "</td>";
            html += "<td>" + planilla.getRIESGO_COMUN() + "</td>";
            html += "<td>" + planilla.getCOMISION_AFP() + "</td>";
            html += "<td>" + planilla.getSOLIDARIO_ASEGURADO() + "</td>";
            html += "<td>" + planilla.getSOLIDARIO_NACIONAL() + "</td>";
            html += "<td>" + planilla.getTOTAL_APORTE_LABORAL() + "</td>";
            html += "<td>" + planilla.getCSBP() + "</td>";
            html += "<td>" + planilla.getRIESGO_PROFESIONAL() + "</td>";
            html += "<td>" + planilla.getPRO_VIVIENDA() + "</td>";
            html += "<td>" + planilla.getAPORTE_SOLIDARIO() + "</td>";
            html += "<td>" + planilla.getTOTAL_APORTE_PATRONAL() + "</td>";
            html += "<td>" + planilla.getRETROACTIVO_NETO_SUJ_IMPUESTOS() + "</td>";
            html += "<td>" + planilla.getMINIMO_NO_IMPONIBLE() + "</td>";
            html += "<td>" + planilla.getDIFERENCIA_SUJ_IMPUESTOS() + "</td>";
            html += "<td>" + planilla.getIMPUESTO_LIQUIDADO() + "</td>";
            html += "<td><input type='number' onblur='recalcular(this," + id_planilla + ");' value='" + planilla.getCOMPUTO_IVA_DDJJ() + "' min='0'/> </td>";
            html += "<td>" + sobre_dos_salarios_minimos + "</td>";
            html += "<td>" + saldo_favor + "</td>";
            html += "<td>" + saldo_favor_empleado + "</td>";
            html += "<td><input type='number' onblur='recalcular(this," + id_planilla + ");' value='" + saldo_mes_anterior + "' min='0'/> </td>";
            html += "<td><input type='number' onblur='recalcular(this," + id_planilla + ");' value='" + moneda_inflacionaria_mes_anterior + "' min='0'/> </td>";
            html += "<td>" + moneda_inflacionaria_actual + "</td>";
            html += "<td>" + actualizacion + "</td>";
            html += "<td>" + sub_total + "</td>";
            html += "<td>" + saldo_total_a_favor_empleado + "</td>";
            html += "<td>" + saldo_utilizado + "</td>";
            html += "<td>" + impuesto_retenido_pagar + "</td>";
            html += "<td>" + saldo_favor_sigte_mes + "</td>";
            html += "<td>" + total_liquido_pagable + "</td>";
            html += "<td><a href='#' onclick='omitir(" + id_planilla + ",this)'>(X)</a></td>";            

            con.commit();
        } catch (SQLException ex) {
            con.rollback();
            ex.printStackTrace();
            html = "";
        }
        return html;
    }

    private int Calculo_entre_fechas(Date fecha1, Date fecha2) {
        Calendar calendario = new GregorianCalendar();
        calendario.set(Calendar.YEAR, 0);
        calendario.set(Calendar.MONTH, 0);
        calendario.set(Calendar.DAY_OF_MONTH, 1);

        int anof = 0;
        int mesf = 0;
        int diaf = 0;

        long diferencia = fecha2.getTime() - fecha1.getTime();
        int dia = (int) (diferencia / (3600000 * 24));
        return dia + 1;
    }

    private String generar(HttpServletRequest request, Conexion con) throws SQLException {
        int ano = Integer.parseInt(request.getParameter("ano"));
        int mes = Integer.parseInt(request.getParameter("mes"));        
        RHH_PLANILLA_RETROACTIVO_CABE cabe = new RHH_PLANILLA_RETROACTIVO_CABE(con).Buscar(ano, mes);
        List<RHH_PLANILLA_RETROACTIVOS> lista =new RHH_PLANILLA_RETROACTIVOS(con).BuscarxCabecera(cabe.getID());
        
        for(RHH_PLANILLA_RETROACTIVOS planilla:lista)
        {
            double debito = planilla.getIMPUESTO_RETENIDO_PAGAR();
            double credito = planilla.getSALDO_FAVOR_SIGUIENTE_MES();
            RHH_CREDITO_FISCAL credito_fiscal = new RHH_CREDITO_FISCAL(con);
            credito_fiscal.setID_USUARIO(planilla.getID_USUARIO());
            credito_fiscal.setDEBITO(debito);
            credito_fiscal.setCREDITO(credito);
            credito_fiscal.Insertar();
            if(debito>credito)
            {
                double resto = debito-credito;
                credito_fiscal.setCREDITO(resto);
                credito_fiscal.setDEBITO(0);
                planilla.Insertar();
            }
        }
        cabe.setESTADO(0);
        cabe.Modificar();
        return "GENERADO CORRECTAMENTE";
    }

    private String omitir(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_planilla"));
        RHH_PLANILLA_RETROACTIVOS planilla = new RHH_PLANILLA_RETROACTIVOS(con).Buscar(id_planilla);
        RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(planilla.getID_USUARIO());
        String html = "<li><span>" + per.getPRIMER_NOMBRE() + " " + per.getPRIMER_APELLIDO() + "</span><input type='checkbox' name='chb_" + planilla.getID_USUARIO() + "'/></li>";
        planilla.EliminarXid();
        return html;
    }

    private String cargarEmpleados(HttpServletRequest request, Conexion con) throws SQLException
    {
        String html="";
        int ano = Integer.parseInt(request.getParameter("ano"));
        int mes = Integer.parseInt(request.getParameter("mes"));
        
        List<RHH_USUARIO> lista = new RHH_USUARIO(con).TodosNotInRetroactivo(mes, ano);
        for(RHH_USUARIO usu:lista)
        {
            RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID(usu.getID_PERSONA());
            html+="<li ><span>"+per.getPRIMER_NOMBRE()+" "+per.getPRIMER_APELLIDO()+"</span><input type='checkbox' name='chb_"+usu.getID()+"'/></li>";
        }                    
        return html;
    }
    
    private String cargar(HttpServletRequest request, Conexion con) throws SQLException {
        String html = "{\"html\":\"";
        int ano = Integer.parseInt(request.getParameter("ano"));
        int mes = Integer.parseInt(request.getParameter("mes"));
        int estado=1;
        String fecha_ini="";
        String fecha_fin="";
        int id_cabe =0;
        RHH_PLANILLA_RETROACTIVO_CABE cabe = new RHH_PLANILLA_RETROACTIVO_CABE(con).Buscar(ano, mes);
        if(cabe!=null)
            id_cabe=cabe.getID();
        List<RHH_PLANILLA_RETROACTIVOS> lista_pla = new RHH_PLANILLA_RETROACTIVOS(con).BuscarxCabecera(id_cabe);
        for (RHH_PLANILLA_RETROACTIVOS pr : lista_pla) {
            RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(pr.getID_USUARIO());
            html += "<tr>";
            html += "<td>" + per.getCI() + "</td>";
            html += "<td>" + per.getLUGAR_EMISION() + "</td>";
            html += "<td>" + per.getPRIMER_NOMBRE() + "</td>";
            html += "<td>" + per.getSEGUNDO_NOMBRE() + "</td>";
            html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
            html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
            html += "<td>" + per.getTELEFONO() + "</td>";
            html += "<td>" + per.getEMAIL() + "</td>";
            html += "<td>" + pr.getFECHA_INGRESO_EMPRESA() + "</td>";
            html += "<td>" + pr.getFECHA_RETIRO_EMPRESA() + "</td>";
            String motivo_retiro = pr.getMOTIVO_RETIRO();
            motivo_retiro = motivo_retiro == null ? "" : motivo_retiro;
            html += "<td>" + motivo_retiro + "</td>";
            String observacion_retiro = pr.getOBSERVACION_RETIRO();
            observacion_retiro = observacion_retiro == null ? "" : observacion_retiro;
            html += "<td>" + observacion_retiro + "</td>";
            html += "<td>" + pr.getANTIGUEDAD_DIA() + "</td>";
            html += "<td>" + pr.getANTIGUEDAD_MES() + "</td>";
            html += "<td>" + pr.getANTIGUEDAD_ANO() + "</td>";
            html += "<td>" + pr.getCARGO() + "</td>";
            int depto = pr.getDEPARTAMENTO();
            String departamento = "***";
            if(depto!=0)            
                departamento = new RHH_DEPARTAMENTO(con).BuscarXid(depto).getDESCRIPCION();            
            
            departamento = departamento == null ? "" : departamento;
            html += "<td>" + departamento + "</td>";
            
            int reg = pr.getREGIONAL();
            String regional = "***";
            if(reg!=0)
                regional=new RHH_REGIONAL(con).BuscarXid(reg).getDESCRIPCION();
            
            regional = regional == null ? "" : regional;
            html += "<td>" + regional + "</td>";
            
            int suc = pr.getSUCURSAL();
            String sucursal = "***";
            if(suc!=0)
                sucursal=new RHH_SUCURSAL(con).BuscarXid(suc).getDESCRIPCION();
            sucursal = sucursal == null ? "" : sucursal;
            html += "<td>" + sucursal + "</td>";
            html += "<td>" + pr.getINCREMENTO_RETROACTIVO_MES_ACT() + "</td>";
            html += "<td>" + pr.getDIAS_DE_RETROACTIVO() + "</td>";
            html += "<td>" + pr.getDIAS_TRABAJADOS() + "</td>";
            html += "<td>" + pr.getTOTAL_MONTO_RETROACTIVO() + "</td>";
            html += "<td>" + pr.getBONO_ANTIGUEDAD() + "</td>";
            html += "<td>" + pr.getTOTAL_GANADO() + "</td>";
            html += "<td>" + pr.getSEGURO_LARGO_PLAZO() + "</td>";
            html += "<td>" + pr.getRIESGO_COMUN() + "</td>";
            html += "<td>" + pr.getCOMISION_AFP() + "</td>";
            html += "<td>" + pr.getSOLIDARIO_ASEGURADO() + "</td>";
            html += "<td>" + pr.getSOLIDARIO_NACIONAL() + "</td>";
            html += "<td>" + pr.getTOTAL_APORTE_LABORAL() + "</td>";
            html += "<td>" + pr.getCSBP() + "</td>";
            html += "<td>" + pr.getRIESGO_PROFESIONAL() + "</td>";
            html += "<td>" + pr.getPRO_VIVIENDA() + "</td>";
            html += "<td>" + pr.getAPORTE_SOLIDARIO() + "</td>";
            html += "<td>" + pr.getTOTAL_APORTE_PATRONAL() + "</td>";
            html += "<td>" + pr.getRETROACTIVO_NETO_SUJ_IMPUESTOS() + "</td>";
            html += "<td>" + pr.getMINIMO_NO_IMPONIBLE() + "</td>";
            html += "<td>" + pr.getDIFERENCIA_SUJ_IMPUESTOS() + "</td>";
            html += "<td>" + pr.getIMPUESTO_LIQUIDADO() + "</td>";
            
            if(cabe.getESTADO()==1)
                html += "<td><input type='number' onblur='recalcular(this," + pr.getID() + ");' value='" + pr.getCOMPUTO_IVA_DDJJ() + "' min='0'/> </td>";
            else
                html += "<td>" + pr.getCOMPUTO_IVA_DDJJ() + "</td>";
            
            html += "<td>" + pr.getSOBRE_2_SALARIOS_MIN() + "</td>";
            html += "<td>" + pr.getSALDO_FAVOR() + "</td>";
            html += "<td>" + pr.getSALDO_FAVOR_EMPLEADO() + "</td>";
            if(cabe.getESTADO()==1)
            {
                html += "<td><input type='number' onblur='recalcular(this," + pr.getID() + ");' value='" + pr.getSALDO_MES_ANTERIOR() + "' min='0'/> </td>";
                html += "<td><input type='number' onblur='recalcular(this," + pr.getID() + ");' value='" + pr.getUFV_MES_PASADO() + "' min='0'/> </td>";
            }
            else
            {
                html += "<td>" + pr.getSALDO_MES_ANTERIOR() + "</td>";
                html += "<td>" + pr.getID() + "</td>";
            }
            html += "<td>" + pr.getUFV_MES_ACTUAL() + "</td>";
            html += "<td>" + pr.getACTUALIZACION() + "</td>";
            html += "<td>" + pr.getSUB_TOTAL() + "</td>";
            html += "<td>" + pr.getSALDO_FAVOR_EMPLEADO() + "</td>";
            html += "<td>" + pr.getSALDO_UTILIZADO() + "</td>";
            html += "<td>" + pr.getIMPUESTO_RETENIDO_PAGAR() + "</td>";
            html += "<td>" + pr.getSALDO_FAVOR_SIGUIENTE_MES() + "</td>";
            html += "<td>" + pr.getTOTAL_RETROACTIVO_PAGABLE() + "</td>";
            if(cabe.getESTADO()==1)
            html += "<td><a href='#' onclick='omitir(" + pr.getID() + ",this);'>(X)</a></td>";
            else
            html += "<td></td>";
            html += "</tr>";
            estado=cabe.getESTADO();
            fecha_ini= pr.getFECHA_INICIO();
            fecha_fin= pr.getFECHA_FIN();
        }
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        Date hoy = new Date();
        if(fecha_ini.equals(""))
            fecha_ini=format.format(hoy);
        
        if(fecha_fin.equals(""))
            fecha_fin=format.format(hoy);
        return html+"\",\"estado\":\""+estado+"\",\"fecha_ini\":\""+fecha_ini+"\",\"fecha_fin\":\""+fecha_fin+"\"}";
    }
}
